還記得第一次看到attr_accessor :cat 其實等於
def cat
@cat #宣告了一個@cat的實體變數
end
def cat= (cat)
@cat = cat #把@cat = cat這個參數
end
再次的見識到ruby的強大啊!
一行抵六行!
等等...那個cat= (cat) 等於不把它分開嗎?
答案是不行!!
當下真的是滿臉黑人問號
在了解之前要先有個觀念
在ruby裡面其實『方法可以覆寫』!
class Cat
@count = 0
def self.new(*)
@count += 1
super
end
end
在這例子裡面偷偷的把new方法偷偷的覆寫掉了
導致每次執行Cat.new的時候@count都會+1
ruby在跑程式碼的時候會先看自己的class有沒有實作method
沒有的話就往上找,有的話就用自己的( new
到這裡就有點了解為什麼上面的cat= 不能分開了吧?!
其實他在偷偷做一些事情
讓我們實際做一次
class Animal
def cat
@cat
end
def cat= (cat)
@cat = cat
end
end
doraemon = Animal.new
p doraemon.cat = 3 #3
不要=了,改成cat會怎樣呢?
class Animal
def cat
@cat
end
def cat (cat)
@cat = cat
end
end
doraemon = Animal.new
p doraemon.cat = 3 #會出現undefined method `cat='
其實當你在doraemon.cat = 3 的時候
看起來像是在做賦值的動作
其實是在呼叫『cat= (cat)』這個 method,並且把『3』這個參數丟給他
再回來主題
其實 attr_reader 在做這件事
def cat
@cat #宣告@這個實體變數的存在
end
attr_writer 則是
def cat= (cat)
@cat = cat #有賦值的功能
end
attr_accessor則是reader跟writer兼具
至於什麼時候該用哪個就要看你的程式要做什麼功能了